package planosSaude;

import util.RepositorioException;

/**
 * Hugo Guttemberg 
 */
public class RepositorioPlanosSaudeLista implements RepositorioPlanosSaude , IteratorPlanoSaude {
	private PlanoSaude planoSaude;
	private RepositorioPlanosSaudeLista prox;
	private RepositorioPlanosSaudeLista auxiliar;
	
	public RepositorioPlanosSaudeLista(){
		this.planoSaude = null;
		this.prox = null;
	}
	
	public void inserir(PlanoSaude planoSaude) throws RepositorioException {
		if(this.planoSaude == null){
			this.planoSaude = planoSaude;
			this.prox = new RepositorioPlanosSaudeLista();
		}
		else{
		    this.prox.inserir(planoSaude);
		}
	}
	
	public void remover(long codigo) throws PlanoSaudeNaoEncontradoException{
		if(this.planoSaude != null){
			if(this.planoSaude.getCodigo() == codigo){
				this.planoSaude = this.prox.planoSaude;
				this.prox = this.prox.prox;
			}
			else{
				this.prox.remover(codigo);
			}
		}
		else{
			
			throw new PlanoSaudeNaoEncontradoException (planoSaude.getCodigo());
		}
	}
	
	public void atualizar(PlanoSaude planoSaude) throws PlanoSaudeNaoEncontradoException{  
		if(this.planoSaude != null){
			if(this.planoSaude.getCodigo() == planoSaude.getCodigo()){
					this.planoSaude = planoSaude;
				}
				else{
					this.prox.atualizar(planoSaude);
				}
		}
		else{
			throw new PlanoSaudeNaoEncontradoException (planoSaude.getCodigo());
		}
	}
	
	public boolean existe(long codigo){
		boolean resultado = false;
		if(this.planoSaude!= null){
			if(this.planoSaude.getCodigo()== codigo){
				resultado = true;
			}
			else{
				resultado = this.prox.existe(codigo);
			}
		}	
		else{
			resultado = false;	
		}
		return resultado;
	}
	
	public RepositorioPlanosSaude procurar(PlanoSaude planoSaude) throws PlanoSaudeEncontradoException, PlanoSaudeNaoEncontradoException, RepositorioException{
		RepositorioPlanosSaudeLista retorno = null;
		if(this.planoSaude != null){
			if (! this.existe(planoSaude.getCodigo())) {
				throw new PlanoSaudeNaoEncontradoException(planoSaude.getCodigo());
			} else {
				if(this.planoSaude.match(planoSaude)){
					retorno.inserir(planoSaude);
				    this.prox.procurar(planoSaude);
				}
				else{
					this.prox.procurar(planoSaude);
				}
			}
		} else {
			throw new PlanoSaudeEncontradoException(planoSaude.getCodigo());
		}
		return retorno;
	}

	public PlanoSaude procurar(long codigo) throws PlanoSaudeNaoEncontradoException{
		PlanoSaude resultado = null;
		if (! this.existe(codigo)) {
			throw new PlanoSaudeNaoEncontradoException(planoSaude.getCodigo());
		} else {
			if(this.planoSaude != null){                       
				if(this.planoSaude.getCodigo()== codigo){
					resultado = this.planoSaude;
				}
				else{
					return this.prox.procurar(codigo);
				}
			}
			else{
				resultado = null;
			}
		}
		return resultado;
	}
	
	public boolean hasNext(){
		boolean retorno = false;
		if(this.auxiliar.planoSaude!=null){
			retorno = true;
		} else {
			retorno = false;
		}
		return retorno;
	}
	public PlanoSaude next(){
		PlanoSaude retorno;
		if(this.hasNext()){
			retorno = this.auxiliar.planoSaude;
			this.auxiliar = this.auxiliar.prox;
		}
		else{
			retorno = null;
		}
		return retorno;
	}
	
	public IteratorPlanoSaude getIterator(){
		this.auxiliar = this;
		return auxiliar;
	}
}
